﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using automobili_security;

using automobili_data.interfaces.exceptions;
using automobili_data.interfaces;
using System.Collections;


namespace automobili_data
{
    class MysqlAutomobiliDataManagerImpl : AutomobiliDataManagerImpl
    {

        public override void createUser(String fn, String ln, String mail, String password)
        {
            SQLExecutor.instance.update("INSERT INTO korisnik(ime, prezime, korime, lozinka, isAdmin) Values(@fn,@ln,@em,@pwd, @ad)",
                new QueryParam("@fn", DbType.String, fn),
                new QueryParam("@ln", DbType.String, ln),
                new QueryParam("@em", DbType.String, mail),
              //  new QueryParam("@pwd", DbType.String, password), //SecurityUtils.ComputeHash(password)
              new QueryParam("@pwd", DbType.String, SecurityUtils.ComputeHash(password)),
            new QueryParam("@ad", DbType.Boolean, 0));

            SQLExecutor.instance.update("insert into privilegije (korisnik_idkor, privilegije_nazivi_privilegije_nazivicol) values ((select idkor from korisnik where korime=@em), 'ulogovan')", new QueryParam("@em", DbType.String, mail));

        }

        public override User getUser(long userId)
        {
            DataTable userInfo = SQLExecutor.instance.executeSelectDT(
                "SELECT * FROM korisnik WHERE userid=@p1",
                new QueryParam("@p1", DbType.Int64, userId));
            if (userInfo.Rows.Count == 1)
            {
                return new User((String)userInfo.Rows[0]["firstName"], (String)userInfo.Rows[0]["lastName"]);
            }
            else
            {
                return null;
            }
        }

        public override User getUser(String username, String password)
        {
            DataTable userInfo = SQLExecutor.instance.executeSelectDT(
                "SELECT idkor, ime, prezime, lozinka, korime, isadmin FROM korisnik WHERE korIme=@p1",
                new QueryParam("@p1", DbType.String, username));

            if (userInfo.Rows.Count == 0)
                throw new automobili_data.interfaces.exceptions.UserNotFoundException();

            string pwdFromDb = userInfo.Rows[0]["lozinka"].ToString();


            if (userInfo.Rows.Count != 0)
            {
                int id = (int)userInfo.Rows[0]["idKor"];
                String ime = userInfo.Rows[0]["ime"].ToString();
                String prezime = userInfo.Rows[0]["prezime"].ToString();
                String korIme = userInfo.Rows[0]["korime"].ToString();
                int admin = (int)userInfo.Rows[0]["isadmin"];
                

                return new User(ime, prezime, korIme, id, admin);
            }
            else
            {
                throw new UserAuthenticationFailedException();
            }
        }

        public override User getUserN(String username)
        {
            DataTable userInfo = SQLExecutor.instance.executeSelectDT(
                "SELECT * FROM korisnik WHERE korIme=@p1",
                new QueryParam("@p1", DbType.String, username));
            if (userInfo.Rows.Count == 0)
            {
                return null;
            }
            else
            {
                return new User(userInfo.Rows[0]["ime"].ToString(),
                                userInfo.Rows[0]["prezime"].ToString());
            }
        }

        public override ArrayList dohvatiModele()
        {
            String upit = "SELECT DISTINCT nazivMo FROM Model";
            ArrayList rez = new ArrayList();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit);
            if (tabela.Rows.Count == 0) return null;

            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(row["nazivMo"]);
            }
            return rez;
        }

        public override ArrayList dohvatiMarke()
        {

            String upit = "SELECT DISTINCT nazivMa from Marka";
            ArrayList rez = new ArrayList();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit);
            if (tabela.Rows.Count == 0) return null;

            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(row["nazivMa"]);
            }
            return rez;
        }

        public override ArrayList dohvatiJezike ()
        {
            String upit = "select distinct Jezik from jezik";
            ArrayList rez = new ArrayList();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(row["Jezik"]);
            }
            return rez;

        }

        public override ArrayList dohvatiGorivo()
        {

            String upit = "SELECT DISTINCT tip from pogonsko_gorivo";
            ArrayList rez = new ArrayList();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit);
            if (tabela.Rows.Count == 0) return null;

            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(row["tip"]);
            }
            return rez;
        }

        public override ArrayList dohvatiKaroseriju()
        {

            String upit = "SELECT DISTINCT nazivK from karoserija";
            ArrayList rez = new ArrayList();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit);
            if (tabela.Rows.Count == 0) return null;

            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(row["nazivK"]);
            }
            return rez;
        }

        public override IList<Automobil> dohvatiDetalje(int i)
        {
            List<Automobil> rez = new List<Automobil>();
            List<QueryParam> param = new List<QueryParam>();
            String upiti = "select a.idaut, godina_proizvodnje, cena, ma.nazivMa, mo.nazivMo, pg.tip, ka.nazivK";
            String upit0 = " from automobil as a";
            String upit1 = " where (";
            String upit2 = "";
            String upit3 = ")";
            param.Add(new QueryParam("@id", DbType.String, i));
            upit0 += " inner join marka as ma on ma.idmarka=a.marka_idmarka ";
            upit0 += " inner join model as mo on mo.idmodel=a.model_idmodel ";
            upit0 += " inner join pogonsko_gorivo as pg on pg.idpogonsko_gorivo=a.pogonsko_gorivo_idpogonsko_gorivo ";
            upit0 += " inner join karoserija as ka on ka.idkaroserija=a.karoserija_idkaroserija ";
            upit2 += "a.idaut=@id";

            QueryParam[] par = param.ToArray();
            String konacan = upiti + upit0 + upit1 + upit2 + upit3;




            DataTable tabela = SQLExecutor.instance.executeSelectDT(konacan, par);
            if (tabela.Rows.Count == 0) return null;


            foreach (DataRow row in tabela.Rows)
            {

                rez.Add(new Automobil((int)row["idaut"], (int)row["godina_proizvodnje"], row["cena"].ToString(), row["nazivMa"].ToString(), row["nazivMo"].ToString(), row["tip"].ToString(), row["nazivK"].ToString()));

            }
            return rez;


        }

        public override IList<Automobil> nadjiAutomobile(String markaa, String model, String karoserija, String gorivo, double cena, int godinaProizv, int skuplj, int jeftinij, int starij, int mladj)
        {
            List<Automobil> rez = new List<Automobil>();
            List<QueryParam> param = new List<QueryParam>();
            String upiti = "select a.idaut, godina_proizvodnje, cena, ma.nazivMa, mo.nazivMo, pg.tip, ka.nazivK"; //izbrisi posle da se ne pojavljuje id u rezultatu pretrage
            String upit = "select a.idaut, godina_proizvodnje, cena";
            String upit0 = " from automobil as a";
            String upit1 = " where (";
            String upit2 = "";
            String upit3 = ")";

            int br = 0;

            if (markaa != null)
            {

                upit0 += " inner join marka as ma on ma.idmarka=a.marka_idmarka ";
                if (br == 0)
                {
                    upit += ", ma.nazivMa";
                    upit2 += " ma.nazivMa=@ma ";
                    br++;
                }
                else
                {
                    upit += ", ma.nazivMa";
                    upit2 += " and ma.nazivMa=@ma ";
                    br++;
                }
                param.Add(new QueryParam("@ma", DbType.String, markaa));
            }
            if (markaa == null) { upit0 += " inner join marka as ma on ma.idmarka=a.marka_idmarka "; }

            if (model != null)
            {

                upit0 += " inner join model as mo on mo.idmodel=a.model_idmodel ";
                if (br == 0)
                {
                    upit += ", mo.nazivMo";
                    upit2 += " mo.nazivMo=@mo ";
                    br++;
                }
                else
                {
                    upit += ", mo.nazivMo";
                    upit2 += " and mo.nazivMo=@mo ";
                    br++;
                }
                param.Add(new QueryParam("@mo", DbType.String, model));
            }

            if (model == null) { upit0 += " inner join model as mo on mo.idmodel=a.model_idmodel "; }

            if (gorivo != null)
            {
                upit0 += " inner join pogonsko_gorivo as pg on pg.idpogonsko_gorivo=a.pogonsko_gorivo_idpogonsko_gorivo ";
                if (br == 0)
                {
                    upit += ", pg.tip";
                    upit2 += " pg.tip=@pg ";
                    br++;
                }
                else
                {
                    upit += ", pg.tip";
                    upit2 += " and pg.tip=@pg ";
                    br++;
                }
                param.Add(new QueryParam("@pg", DbType.String, gorivo));
            }

            if (gorivo == null) { upit0 += " inner join pogonsko_gorivo as pg on pg.idpogonsko_gorivo=a.pogonsko_gorivo_idpogonsko_gorivo "; }

            if (karoserija != null)
            {
                upit0 += " inner join karoserija as ka on ka.idkaroserija=a.karoserija_idkaroserija ";
                if (br == 0)
                {
                    upit += ", ka.nazivK";
                    upit2 += " ka.nazivK=@ka ";
                    br++;
                }
                else
                {
                    upit += ", ka.nazivK";
                    upit2 += " and ka.nazivK=@ka ";
                    br++;
                }
                param.Add(new QueryParam("@ka", DbType.String, karoserija));
            }

            if (karoserija == null) { upit0 += " inner join karoserija as ka on ka.idkaroserija=a.karoserija_idkaroserija "; }

            if (cena != 0)
            {
                if (skuplj == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " cena>=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena>=@c ";
                        br++;
                    }
                }
                if (jeftinij == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " cena<=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena<=@c ";
                        br++;
                    }
                }
                if (skuplj == 0 && jeftinij == 0)
                {
                    if (br == 0)
                    {
                        upit2 += " cena>=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena>=@c ";
                        br++;
                    }
                }

                param.Add(new QueryParam("@c", DbType.Double, cena));
            }

            if (godinaProizv != 0)
            {
                if (starij == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje>=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje>=@g ";
                        br++;
                    }
                }
                if (mladj == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje<=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje<=@g ";
                        br++;
                    }
                }
                if (starij == 0 && mladj == 0)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje=@g ";
                        br++;
                    }
                }
                param.Add(new QueryParam("@g", DbType.Int32, godinaProizv));
            }


            QueryParam[] par = param.ToArray();
            String konacan = null;

            if (br == 0) { konacan = upiti + upit0; }
            else
            {
                konacan = upiti + upit0 + upit1 + upit2 + upit3;
            }



            DataTable tabela = SQLExecutor.instance.executeSelectDT(konacan, par);
            if (tabela.Rows.Count == 0) return null;


            foreach (DataRow row in tabela.Rows)
            {

                rez.Add(new Automobil((int)row["idaut"], (int)row["godina_proizvodnje"], row["cena"].ToString(), row["nazivMa"].ToString(), row["nazivMo"].ToString(), row["tip"].ToString(), row["nazivK"].ToString()));

            }
            return rez;



        }

        public override IList<Automobil> nadjiAutomobileDeo(String markaa, String model, String karoserija, String gorivo, double cena, int godinaProizv, int skuplj, int jeftinij, int starij, int mladj)
        {
            List<Automobil> rez = new List<Automobil>();
            List<QueryParam> param = new List<QueryParam>();
            String upiti = "select a.idaut, godina_proizvodnje, cena, ma.nazivMa, mo.nazivMo"; //izbrisi posle da se ne pojavljuje id u rezultatu pretrage
            String upit = "select a.idaut, godina_proizvodnje, cena";
            String upit0 = " from automobil as a";
            String upit1 = " where (";
            String upit2 = "";
            String upit3 = ")";

            int br = 0;

            if (markaa != null)
            {

                upit0 += " inner join marka as ma on ma.idmarka=a.marka_idmarka ";
                if (br == 0)
                {
                    upit += ", ma.nazivMa";
                    upit2 += " ma.nazivMa=@ma ";
                    br++;
                }
                else
                {
                    upit += ", ma.nazivMa";
                    upit2 += " and ma.nazivMa=@ma ";
                    br++;
                }
                param.Add(new QueryParam("@ma", DbType.String, markaa));
            }
            if (markaa == null) { upit0 += " inner join marka as ma on ma.idmarka=a.marka_idmarka "; }

            if (model != null)
            {

                upit0 += " inner join model as mo on mo.idmodel=a.model_idmodel ";
                if (br == 0)
                {
                    upit += ", mo.nazivMo";
                    upit2 += " mo.nazivMo=@mo ";
                    br++;
                }
                else
                {
                    upit += ", mo.nazivMo";
                    upit2 += " and mo.nazivMo=@mo ";
                    br++;
                }
                param.Add(new QueryParam("@mo", DbType.String, model));
            }

            if (model == null) { upit0 += " inner join model as mo on mo.idmodel=a.model_idmodel "; }


            if (cena != 0)
            {
                if (skuplj == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " cena>=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena>=@c ";
                        br++;
                    }
                }
                if (jeftinij == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " cena<=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena<=@c ";
                        br++;
                    }
                }
                if (skuplj == 0 && jeftinij == 0)
                {
                    if (br == 0)
                    {
                        upit2 += " cena>=@c ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and cena>=@c ";
                        br++;
                    }
                }

                param.Add(new QueryParam("@c", DbType.Double, cena));
            }

            if (godinaProizv != 0)
            {
                if (starij == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje>=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje>=@g ";
                        br++;
                    }
                }
                if (mladj == 1)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje<=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje<=@g ";
                        br++;
                    }
                }
                if (starij == 0 && mladj == 0)
                {
                    if (br == 0)
                    {
                        upit2 += " godina_proizvodnje=@g ";
                        br++;
                    }
                    else
                    {

                        upit2 += " and godina_proizvodnje=@g ";
                        br++;
                    }
                }
                param.Add(new QueryParam("@g", DbType.Int32, godinaProizv));
            }


            QueryParam[] par = param.ToArray();
            String konacan = null;

            if (br == 0) { konacan = upiti + upit0; }
            else
            {
                konacan = upiti + upit0 + upit1 + upit2 + upit3;
            }



            DataTable tabela = SQLExecutor.instance.executeSelectDT(konacan, par);
            if (tabela.Rows.Count == 0) return null;


            foreach (DataRow row in tabela.Rows)
            {

                rez.Add(new Automobil((int)row["idaut"], (int)row["godina_proizvodnje"], row["cena"].ToString(), row["nazivMa"].ToString(), row["nazivMo"].ToString()));

            }
            return rez;



        } //kraj f-je

        public override void unesiOglas(string marka, string model, string karoserija, string gorivo, double cena, int godinaProizv)
        {

            List<QueryParam> param = new List<QueryParam>();

            param.Add(new QueryParam("@g", DbType.Int32, godinaProizv));
            param.Add(new QueryParam("@c", DbType.Double, cena));
            param.Add(new QueryParam("@ma", DbType.String, marka));
            param.Add(new QueryParam("@mo", DbType.String, model));
            param.Add(new QueryParam("@pg", DbType.String, gorivo));
            param.Add(new QueryParam("@ka", DbType.String, karoserija));
            String upit0 = " select idmarka from marka where nazivMa=@ma ";
            String upit1 = " select idmodel from model where nazivMo=@mo ";
            String upit2 = " select idpogonsko_gorivo from pogonsko_gorivo where tip=@pg ";
            String upit3 = " select idkaroserija from karoserija where nazivK=@ka ";
            String upit = "insert into automobil (Godina_proizvodnje, Cena, marka_idmarka, model_idmodel, pogonsko_gorivo_idpogonsko_gorivo, karoserija_idkaroserija) values (@g, @c, (" + upit0 + "), (" + upit1 + "), (" + upit2 + "), (" + upit3 + "))";
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);

        }

        public override void aktivacija (int idOgl, int status)
        {
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idOgl));
            QueryParam[] par = param.ToArray();
            String upit = "";
            if (status == 1)
            {
                 upit = "UPDATE oglas SET aktivan = 0 WHERE (idogl = @par) ";
            }
            else
            {
                 upit = "UPDATE oglas SET aktivan = 1 WHERE (idogl = @par) ";
            }
            SQLExecutor.instance.update(upit, par);
        }

        public override void produziRezervaciju (int idRez)
        {
            String upit = "select datumDo from rezervacija where idrez=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idRez));
            QueryParam[] par = param.ToArray();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            DateTime dt;
            //foreach (DataRow row in tabela.Rows)
           // {
            DataRow row = tabela.Rows[0];
                dt=DateTime.Parse(row["datumDo"].ToString()).AddDays(3);
                //dt.AddDays(7);
                param.Add(new QueryParam("@par0", DbType.String, dt.ToShortDateString()));
            //}

            par = param.ToArray();
            upit = "update rezervacija set datumDo=@par0 where idrez=@par";
            SQLExecutor.instance.update(upit, par);
        }

        public override Privilegije dohvatiPrivilegije(User kor)
        {
            List<QueryParam> param = new List<QueryParam>();
            
            param.Add(new QueryParam("@ko", DbType.Int64, kor.UserId));
            QueryParam[] par = param.ToArray();
            String upit = "SELECT privilegije_nazivi.pretraga_po_kriterijumima_svi, privilegije_nazivi.prikaz_detalja_svi, privilegije_nazivi.registrovanje_korisnika_svi, privilegije_nazivi.prijava_na_sistem_svi, privilegije_nazivi.oglasavanje_k, privilegije_nazivi.rezervisanje_k, privilegije_nazivi.pregled_svojih_oglasa_k, privilegije_nazivi.pregled_svojih_akt_rez_k, privilegije_nazivi.promena_naloga_k, privilegije_nazivi.odr_privilegija_a, privilegije_nazivi.def_param_sistema_a, privilegije_nazivi.def_nabrojivih_param_auto_a FROM privilegije INNER JOIN privilegije_nazivi ON privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol = privilegije_nazivi.PRIVILEGIJE_NAZIVIcol WHERE (privilegije.KORISNIK_IDKor = @ko) ";
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0)
            {
                return null;}
            else {
                // foreach (DataRow row in tabela.Rows){
                return new Privilegije((int)tabela.Rows[0]["Pretraga_po_kriterijumima_svi"], (int)tabela.Rows[0]["Prikaz_detalja_svi"], (int)tabela.Rows[0]["Registrovanje_korisnika_svi"], 
                    (int)tabela.Rows[0]["Prijava_na_sistem_svi"], (int)tabela.Rows[0]["Oglasavanje_k"], (int)tabela.Rows[0]["Rezervisanje_k"],
                    (int)tabela.Rows[0]["Pregled_svojih_oglasa_k"], (int)tabela.Rows[0]["Pregled_svojih_akt_rez_k"], (int)tabela.Rows[0]["Promena_naloga_k"], 
                    (int)tabela.Rows[0]["Odr_privilegija_a"], (int)tabela.Rows[0]["Def_param_sistema_a"], (int)tabela.Rows[0]["Def_nabrojivih_param_auto_a"]);
                //}
            }
            
         
            

        }

      //  public override void kreirajOglas(int idKor, int aktivan)
        public override void kreirajOglas(int idKor, int aktivan)

        {
            String upit = "insert into oglas (korisnik_idkor, automobil_idaut, datum, aktivan) values (@idkor, (select max(idaut) from automobil), @datum, @aktivan)";
           // String upit1 = "select idOgl, Datum from oglas where idOgl=(select max(idOgl))";
            
            List<QueryParam> param = new List<QueryParam>();
         //   List<Oglas> rez = new List<Oglas>();
 
            param.Add(new QueryParam("@idkor", DbType.Int32, idKor));
            param.Add(new QueryParam("@datum", DbType.String, DateTime.Now));
            param.Add(new QueryParam("aktivan", DbType.Int32, aktivan));
           
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);

            //DataTable tabela = SQLExecutor.instance.executeSelectDT(upit1, par);
            //if (tabela.Rows.Count == 0) return null;
            //DateTime d = new DateTime();
            //foreach (DataRow row in tabela.Rows)
            //{

            //    rez.Add(new Oglas((int)row["idOgl"]));
                
           //     d = DateTime.Parse(row["Datum"].ToString());
             //   rez.Add(new Oglas(d));

           // }
           // return rez;

        }

        public override IList<Oglas> podaciZaMail (int idKor)
        {
            String upit = "select idOgl, Datum from oglas where idOgl=(select max(idOgl) from oglas)";
            List<Oglas> rez = new List<Oglas>();
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@id", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();

            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            
            foreach (DataRow row in tabela.Rows)
            {

                rez.Add(new Oglas((int)row["idOgl"], DateTime.Parse(row["Datum"].ToString())));
               
              

            }
            return rez;

        }

        public override void kreirajRezervaciju (int idKor, int idAut )
        {
            //String query = "SELECT idogl, korisnik_idkor from oglas where automobil_idaut=@par";
            

            String upit = "insert ignore into rezervacija (korisnik_idkor, oglas_idogl, oglas_korisnik_idkor, oglas_automobil_idaut, datumOd, datumDo) values (@par1, (select idogl from oglas where automobil_idaut=@par), (select korisnik_idkor from oglas where automobil_idaut=@par), @par, @par2, @par3)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idAut));
            param.Add(new QueryParam("@par1", DbType.Int32, idKor));
            param.Add(new QueryParam("@par2", DbType.String, DateTime.Now.ToShortDateString()));
            param.Add(new QueryParam("@par3", DbType.String, DateTime.Now.AddDays(7).ToShortDateString()));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        }



        public override IList<Rezervacija> podaciZaRezervaciju ()
        {

            String upit = "select idrez, oglas_idogl from rezervacija where ( (select max(idrez) from rezervacija)=idrez )";
            List<QueryParam> param = new List<QueryParam>();
            QueryParam[] par = param.ToArray();
            List<Rezervacija> rez = new List<Rezervacija>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;

            foreach (DataRow row in tabela.Rows)
            {

                rez.Add(new Rezervacija((int)row["idRez"], (int)row["oglas_idogl"]));



            }
            return rez;

        }

        public override IList<Oglas> dohvatiOglase (int idKor)
        {
          //  String upit = "select idogl from oglas where korisnik_idkor = @par";
            String upit = "SELECT oglas.idogl, oglas.aktivan, automobil.Godina_proizvodnje, automobil.Cena, marka.nazivMa, model.nazivMo, pogonsko_gorivo.tip, karoserija.nazivK FROM oglas INNER JOIN automobil ON oglas.AUTOMOBIL_IDAut = automobil.idaut INNER JOIN marka ON automobil.marka_idmarka = marka.idmarka AND automobil.marka_idmarka = marka.idmarka INNER JOIN model ON automobil.model_idmodel = model.idmodel INNER JOIN karoserija ON automobil.karoserija_idkaroserija = karoserija.idkaroserija INNER JOIN pogonsko_gorivo ON automobil.pogonsko_gorivo_idpogonsko_gorivo = pogonsko_gorivo.idpogonsko_gorivo WHERE (oglas.KORISNIK_IDKor = @par)"; 
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            List<Oglas> rez = new List<Oglas>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new Oglas((int)row["idOgl"], row["nazivMa"].ToString(), row["nazivMo"].ToString(), row["nazivK"].ToString(), row["tip"].ToString(), row["Cena"].ToString(), (int)row["aktivan"]));
                //], (int)row["korisnik_idkor"], (int)row["automobil_idaut"], row["datum"].ToString(), (int)row["aktiv
            }
            return rez;

        }

        public override IList<Rezervacija> dohvatiRezervacije (int idKor)
        {
            //  String upit = "select idogl from oglas where korisnik_idkor = @par";
            String upit = "SELECT rezervacija.idrez, automobil.Godina_proizvodnje, automobil.Cena, marka.nazivMa, model.nazivMo, pogonsko_gorivo.tip, karoserija.nazivK, rezervacija.DatumOd, rezervacija.DatumDo FROM rezervacija INNER JOIN automobil ON rezervacija.OGLAS_AUTOMOBIL_IDAut = automobil.idaut INNER JOIN marka ON automobil.marka_idmarka = marka.idmarka AND automobil.marka_idmarka = marka.idmarka INNER JOIN model ON automobil.model_idmodel = model.idmodel INNER JOIN karoserija ON automobil.karoserija_idkaroserija = karoserija.idkaroserija INNER JOIN pogonsko_gorivo ON automobil.pogonsko_gorivo_idpogonsko_gorivo = pogonsko_gorivo.idpogonsko_gorivo WHERE (rezervacija.KORISNIK_IDKor = @par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            List<Rezervacija> rez = new List<Rezervacija>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new Rezervacija((int)row["idrez"], row["nazivMa"].ToString(), row["nazivMo"].ToString(), row["nazivK"].ToString(), row["tip"].ToString(), row["Cena"].ToString(), row["DatumOd"].ToString(), row["DatumDo"].ToString()));
                //], (int)row["korisnik_idkor"], (int)row["automobil_idaut"], row["datum"].ToString(), (int)row["aktiv
            }
            return rez;

        }

        public override IList<Rezervacija> dohvatiRezervacije ()
        {
            //  String upit = "select idogl from oglas where korisnik_idkor = @par";
            String upit = "SELECT rezervacija.idrez, automobil.Godina_proizvodnje, automobil.Cena, marka.nazivMa, model.nazivMo, pogonsko_gorivo.tip, karoserija.nazivK, rezervacija.DatumOd, rezervacija.DatumDo FROM rezervacija INNER JOIN automobil ON rezervacija.OGLAS_AUTOMOBIL_IDAut = automobil.idaut INNER JOIN marka ON automobil.marka_idmarka = marka.idmarka AND automobil.marka_idmarka = marka.idmarka INNER JOIN model ON automobil.model_idmodel = model.idmodel INNER JOIN karoserija ON automobil.karoserija_idkaroserija = karoserija.idkaroserija INNER JOIN pogonsko_gorivo ON automobil.pogonsko_gorivo_idpogonsko_gorivo = pogonsko_gorivo.idpogonsko_gorivo";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, 0));
            QueryParam[] par = param.ToArray();
            List<Rezervacija> rez = new List<Rezervacija>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new Rezervacija((int)row["idrez"], row["nazivMa"].ToString(), row["nazivMo"].ToString(), row["nazivK"].ToString(), row["tip"].ToString(), row["Cena"].ToString(), row["DatumOd"].ToString(), row["DatumDo"].ToString()));
                //], (int)row["korisnik_idkor"], (int)row["automobil_idaut"], row["datum"].ToString(), (int)row["aktiv
            }
            return rez;

        }

        public override IList<Privilegije> dohvatiPrivilegije ()
        {
            String upit = "SELECT privilegije.KORISNIK_IDKor, privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol FROM privilegije INNER JOIN privilegije_nazivi ON privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol = privilegije_nazivi.PRIVILEGIJE_NAZIVIcol";
            List<QueryParam> param = new List<QueryParam>();
            QueryParam[] par = param.ToArray();
            List<Privilegije> rez = new List<Privilegije>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new Privilegije((int)row["korisnik_idkor"], row["privilegije_nazivi_privilegije_nazivicol"].ToString()));
               
            }
            return rez;

        }

        public override Privilegije dohvatiPrivilegijeP (int idKor)
        {
            String upit = "SELECT privilegije_nazivi.pretraga_po_kriterijumima_svi, privilegije_nazivi.prikaz_detalja_svi, privilegije_nazivi.registrovanje_korisnika_svi, privilegije_nazivi.prijava_na_sistem_svi, privilegije_nazivi.oglasavanje_k, privilegije_nazivi.rezervisanje_k, privilegije_nazivi.pregled_svojih_oglasa_k, privilegije_nazivi.pregled_svojih_akt_rez_k, privilegije_nazivi.promena_naloga_k, privilegije_nazivi.odr_privilegija_a, privilegije_nazivi.def_param_sistema_a, privilegije_nazivi.def_nabrojivih_param_auto_a FROM privilegije INNER JOIN privilegije_nazivi ON privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol = privilegije_nazivi.PRIVILEGIJE_NAZIVIcol where privilegije.korisnik_idkor=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            Privilegije rez = null;
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez = new Privilegije((int)row["pretraga_po_kriterijumima_svi"], (int)row["prikaz_detalja_svi"], (int)row["registrovanje_korisnika_svi"], (int)row["prijava_na_sistem_svi"], (int)row["oglasavanje_k"], (int)row["rezervisanje_k"], (int)row["pregled_svojih_oglasa_k"], (int)row["pregled_svojih_akt_rez_k"], (int)row["promena_naloga_k"], (int)row["odr_privilegija_a"], (int)row["def_param_sistema_a"], (int)row["def_nabrojivih_param_auto_a"]);

            }
            return rez;

        }

        public override IList<Privilegije> dohvatiPrivilegije (int idKor)
        {
            String upit = "SELECT privilegije_nazivi.pretraga_po_kriterijumima_svi, privilegije_nazivi.prikaz_detalja_svi, privilegije_nazivi.registrovanje_korisnika_svi, privilegije_nazivi.prijava_na_sistem_svi, privilegije_nazivi.oglasavanje_k, privilegije_nazivi.rezervisanje_k, privilegije_nazivi.pregled_svojih_oglasa_k, privilegije_nazivi.pregled_svojih_akt_rez_k, privilegije_nazivi.promena_naloga_k, privilegije_nazivi.odr_privilegija_a, privilegije_nazivi.def_param_sistema_a, privilegije_nazivi.def_nabrojivih_param_auto_a FROM privilegije INNER JOIN privilegije_nazivi ON privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol = privilegije_nazivi.PRIVILEGIJE_NAZIVIcol where privilegije.korisnik_idkor=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            List<Privilegije> rez = new List<Privilegije>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new Privilegije((int)row["pretraga_po_kriterijumima_svi"], (int)row["prikaz_detalja_svi"], (int)row["registrovanje_korisnika_svi"], (int)row["prijava_na_sistem_svi"], (int)row["oglasavanje_k"], (int)row["rezervisanje_k"], (int)row["pregled_svojih_oglasa_k"], (int)row["pregled_svojih_akt_rez_k"], (int)row["promena_naloga_k"], (int)row["odr_privilegija_a"], (int)row["def_param_sistema_a"], (int)row["def_nabrojivih_param_auto_a"]));

            }
            return rez;

        }
        public override Privilegije dohvatiPodrazPrivilegije ()
        {
            String upit = "SELECT privilegije_nazivi.pretraga_po_kriterijumima_svi, privilegije_nazivi.prikaz_detalja_svi, privilegije_nazivi.registrovanje_korisnika_svi, privilegije_nazivi.prijava_na_sistem_svi, privilegije_nazivi.oglasavanje_k, privilegije_nazivi.rezervisanje_k, privilegije_nazivi.pregled_svojih_oglasa_k, privilegije_nazivi.pregled_svojih_akt_rez_k, privilegije_nazivi.promena_naloga_k, privilegije_nazivi.odr_privilegija_a, privilegije_nazivi.def_param_sistema_a, privilegije_nazivi.def_nabrojivih_param_auto_a FROM privilegije INNER JOIN privilegije_nazivi ON privilegije.PRIVILEGIJE_NAZIVI_PRIVILEGIJE_NAZIVIcol = privilegije_nazivi.PRIVILEGIJE_NAZIVIcol WHERE (privilegije_nazivi.PRIVILEGIJE_NAZIVIcol = 'javno')";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, 0));
            QueryParam[] par = param.ToArray();
            Privilegije rez = null;
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
               rez = new Privilegije((int)row["pretraga_po_kriterijumima_svi"], (int)row["prikaz_detalja_svi"], (int)row["registrovanje_korisnika_svi"], (int)row["prijava_na_sistem_svi"], (int)row["oglasavanje_k"], (int)row["rezervisanje_k"], (int)row["pregled_svojih_oglasa_k"], (int)row["pregled_svojih_akt_rez_k"], (int)row["promena_naloga_k"], (int)row["odr_privilegija_a"], (int)row["def_param_sistema_a"], (int)row["def_nabrojivih_param_auto_a"]);

            }
            return rez;

        }

        public override void kreirajProfil (string korIme)
        {
            String upit = "insert into profil (InfoKor, VelStranice, KORISNIK_IDKor, JEZIK_IDJez) values (@par,9,(select idKor from korisnik where korime=@par),1)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, korIme));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        }

        public override IList<User> dohvatiProfil (int idKor)
        {
            String upit = "SELECT profil.InfoKor, profil.VelStranice, profil.KORISNIK_IDKor, korisnik.Ime, korisnik.Prezime, korisnik.KorIme, korisnik.Lozinka, korisnik.isAdmin, jezik.Jezik FROM profil INNER JOIN korisnik ON profil.KORISNIK_IDKor = korisnik.IDKor INNER JOIN jezik ON profil.JEZIK_IDJez = jezik.IDJez where profil.KORISNIK_IDKor=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            List<User> rez = new List<User>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new User(row["Ime"].ToString(), row["Prezime"].ToString(), row["KorIme"].ToString(), (int)row["KORISNIK_IDKor"], row["Jezik"].ToString(), (int)row["VelStranice"]));

            }
            return rez;

        }

        public override void kreirajPrivilegiju (Privilegije privilegije)
        {
            String upit = "insert into privilegije_nazivi  values (@par0, @par1, @par2, @par3, @par4, @par5, @par6, @par7, @par8, @par9, @par10, @par11, @par12) ";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par0", DbType.String, privilegije.NazivP));
            param.Add(new QueryParam("@par1", DbType.Int32, privilegije.Pretraga_s));
            param.Add(new QueryParam("@par2", DbType.Int32, privilegije.PrikazDetalja_s));
            param.Add(new QueryParam("@par3", DbType.Int32, privilegije.Registracije_s));
            param.Add(new QueryParam("@par4", DbType.Int32, privilegije.Prijava_s));
            param.Add(new QueryParam("@par5", DbType.Int32, privilegije.Oglasavanje_k));
            param.Add(new QueryParam("@par6", DbType.Int32, privilegije.Rezervisanje_k));
            param.Add(new QueryParam("@par7", DbType.Int32, privilegije.SopsOglasi));
            param.Add(new QueryParam("@par8", DbType.Int32, privilegije.SopsRezerv_k));
            param.Add(new QueryParam("@par9", DbType.Int32, privilegije.ProfilPromena_k));
            param.Add(new QueryParam("@par10", DbType.Int32, privilegije.Privilegije_a));
            param.Add(new QueryParam("@par11", DbType.Int32, privilegije.DefParSist_a));
            param.Add(new QueryParam("@par12", DbType.Int32, privilegije.DefNabParAuto_a));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);

            String upit1 = "update privilegije set privilegije_nazivi_privilegije_nazivicol = @parr1 where korisnik_idkor=@parr0";
            List<QueryParam> param1 = new List<QueryParam>();
            param1.Add(new QueryParam("@parr0", DbType.Int32, privilegije.IdKor));
            param1.Add(new QueryParam("@parr1", DbType.String, privilegije.NazivP));
            QueryParam[] par1 = param1.ToArray();
            SQLExecutor.instance.update(upit1, par1);
        }

        public override void dodajMarku (string marka)
        {
            String upit = "insert into marka (nazivMa) values (@par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, marka));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        }

        public override void dodajModel (string model)
        {
            String upit = "insert into model (nazivMo) values (@par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, model));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        
        }

        public override void dodajGorivo (string gorivo)
        {
            String upit = "insert into pogonsko_gorivo (tip) values (@par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, gorivo));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        
        }

        public override void dodajKaroseriju (string karoserija)
        {
            String upit = "insert into karoserija (nazivK) values (@par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, karoserija));
            QueryParam[] par = param.ToArray();
            SQLExecutor.instance.update(upit, par);
        
        }

        public override void azurirajProfil (string ime, string prezime, string korIme, int idKor, string jezik, int velicina)
        {
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par0", DbType.String, ime));
            param.Add(new QueryParam("@par1", DbType.String, prezime));
            param.Add(new QueryParam("@par2", DbType.String, korIme));
            param.Add(new QueryParam("@par3", DbType.Int32, idKor));
            param.Add(new QueryParam("@par4", DbType.String, jezik));
            param.Add(new QueryParam("@par5", DbType.Int32, velicina));
            QueryParam[] par = param.ToArray();
            String upit0 = "update korisnik set Ime=@par0, Prezime=@par1, KorIme=@par2 where IDKor=@par3";
            String upit1 = "update profil set InfoKor = @par2, VelStranice=@par5, jezik_idjez=(select idjez from jezik where jezik=@par4) where korisnik_idkor=@par3";
            SQLExecutor.instance.update(upit0, par);
            SQLExecutor.instance.update(upit1, par);
        }

        public override IList<User> dohvatiKontakt (int idAut)
        {
            String upit = "select Ime, Prezime, KorIme from korisnik where idKor=(select korisnik_idkor from oglas where automobil_idaut=@par)";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("par", DbType.Int32, idAut));
            QueryParam[] par = param.ToArray();
            List<User> rez = new List<User>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new User(row["Ime"].ToString(), row["Prezime"].ToString(), row["KorIme"].ToString()));

            }
            return rez;
        }

        public override int proveraKorisnickog (string korIme)
        {
            int i=0;
            String upit = "select * from korisnik where korIme=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("@par", DbType.String, korIme));
            QueryParam[] par = param.ToArray();
            DataTable tabela = null;
            tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela != null)
            {
                i = 1;
            }
            else
            {
                i = 0;
            }
            return i;
        }

        public override IList<User> dohvatiKorisnika (int idKor)
        {
            String upit = "select Ime, Prezime, KorIme from korisnik where idKor=@par";
            List<QueryParam> param = new List<QueryParam>();
            param.Add(new QueryParam("par", DbType.Int32, idKor));
            QueryParam[] par = param.ToArray();
            List<User> rez = new List<User>();
            DataTable tabela = SQLExecutor.instance.executeSelectDT(upit, par);
            if (tabela.Rows.Count == 0) return null;
            foreach (DataRow row in tabela.Rows)
            {
                rez.Add(new User(row["Ime"].ToString(), row["Prezime"].ToString(), row["KorIme"].ToString()));

            }
            return rez;
        }

    }
}
    

